package com.java8.lambda.dome;


import com.java8.lambda.bean.Person;
import com.java8.lambda.bean.PersonComparator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Supplier;

public class test9 {
    public static void main(String[] args) {

        //----------引用静态方法-----------

        List<Person> persons = new ArrayList<>();
        persons.add(new Person(1, "张三", 28));
        persons.add(new Person(1, "李四", 25));
        persons.add(new Person(1, "王五", 27));

        //使用Lambda表达式
        Collections.sort(persons, (p1, p2) -> p1.getAge().compareTo(p2.getAge()));
        System.out.println("使用Lambda表达式:");
        persons.forEach(System.out::println);

        //使用lambda表达式+类的静态方法
        persons = new ArrayList<>();
        persons.add(new Person(1, "张三", 28));
        persons.add(new Person(1, "李四", 25));
        persons.add(new Person(1, "王五", 27));
        Collections.sort(persons, (p1, p2) -> Person.compareByAge(p1, p2));
        System.out.println("使用lambda表达式+类的静态方法:");
        persons.forEach(System.out::println);

        //使用方法引用 : 引用的是类的静态方法
        persons = new ArrayList<>();
        persons.add(new Person(1, "张三", 28));
        persons.add(new Person(1, "李四", 25));
        persons.add(new Person(1, "王五", 27));

        Collections.sort(persons, Person::compareByAge);
        System.out.println("使用方法引用 : 引用的是类的静态方法");
        persons.forEach(System.out::println);


        //----------引用对象的实例方法-----------
        persons = new ArrayList<>();
        persons.add(new Person(1, "张三", 28));
        persons.add(new Person(1, "李四", 25));
        persons.add(new Person(1, "王五", 27));


        PersonComparator personComparator = new PersonComparator();
        //使用lambda表达式： 对象的实例方法
        Collections.sort(persons, (p1, p2) -> personComparator.compareByAge(p1, p2));
        System.out.println("使用lambda表达式： 对象的实例方法");
        persons.forEach(System.out::println);

        //使用方法引用：引用的是对象的实例方法
        persons = new ArrayList<>();
        persons.add(new Person(1, "张三", 28));
        persons.add(new Person(1, "李四", 25));
        persons.add(new Person(1, "王五", 27));
        Collections.sort(persons, personComparator::compareByAge);
        System.out.println("使用方法引用：引用的是对象的实例方法");
        persons.forEach(System.out::println);


        // ----------引用类型对象的实例方法 -------------------

        String[] stringsArray = new String[]{"王五", "张三", "李四"};
        //使用lambda表达式： 类型对象的实例方法
        Arrays.sort(stringsArray, (s1, s2) -> s1.compareTo(s2));
        System.out.println("使用lambda表达式： 类型对象的实例方法");
        for (String str : stringsArray) {
            System.out.print(str + " ");
        }

        //使用方法引用：引用的是类型对象的实例方法
        stringsArray = new String[]{"王五", "张三", "李四"};
        Arrays.sort(stringsArray, String::compareTo);
        System.out.println("");
        System.out.println("使用方法引用：引用的是类型对象的实例方法");
        for (String str : stringsArray) {
            System.out.print(str + " ");
        }


        //使用方法引用：引用构造方法
        Supplier<Person> supplier = Person::new;
        Person person = supplier.get();
        System.out.println(person);
    }
}
